﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using LH.Library;
using TVPeruRFIDMovil.Clases.Movil;
using TVPeruRFIDMovil.ServicioWS;

namespace TVPeruRFIDMovil.Clases.Negocio
{
    public class Interfase:IDisposable
    {
        #region --- Declaracion de variables ---

        private ServicioWS.Servicio standarWS;

        /// <summary>
        /// Enum: Tipo de conexion a fuente de datos
        /// </summary>
        private enum TipoAcceso
        {
            WebService = 1,
            SQLDB = 2
        };
        #endregion

        #region --- Constructor y Destructor ---
        public Interfase() { }

        private bool disposedValue = false; // Para detectar llamadas redundantes

        // IDisposable
        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposedValue)
            {
                if (disposing)
                {
                    //if (this.standarBD != null) this.standarBD.Dispose();
                    //this.standarBD = null;
                    if( standarWS != null ) standarWS.Dispose();
                    standarWS = null;
                }
            }
            this.disposedValue = true;
        }

        public void Dispose()
        {
            // No cambie este código. Coloque el código de limpieza en Dispose (ByVal que se dispone como Boolean).
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        #endregion

        #region --- Procedimiento de Inicializacion ---
        private void iniciaClase(TipoAcceso tipo)
        {
            switch (tipo)
            {
                case TipoAcceso.WebService:
                    if (standarWS == null)
                    {
                        standarWS = new ServicioWS.Servicio();
                        standarWS.Url = standarWS.Url.Replace("localhost", ParametrosAplicacion.URLWS); //"http://172.16.19.112:1677/Servicio.asmx"; 
                        standarWS.Timeout = ParametrosAplicacion.TIEMPOFUERA;
                    }

                    if (!Util.VerficarConexionWeb(standarWS.Url, false)) throw new Exception("Terminal Móvil sin Conexión a Internet ó sin Conexión al Servidor. Verifique sus Conexiones.");
                    break;
                case TipoAcceso.SQLDB:
                    //if (this.standarBD == null)
                    //{
                    //    this.standarBD = new Datos.SqLiteData(Libreria.STR_RUTABASEDATOS);
                    //}
                    break;
            }
        }

        public void probrarConexionWs()
        {
            try
            {
                iniciaClase(TipoAcceso.WebService);
            }
            finally
            {
                //if( cStandarWS != null ) cStandarWS.Dispose();
                //cStandarWS = null;
            }
        }
        #endregion

        #region --- Metodos Propios ---

        //LOGIN
        public Almacen[] listarAlmacen()
        {
            // Inicializando servicio web
            iniciaClase(TipoAcceso.WebService);

            // Invocando metodo web y retornando resultado
            return standarWS.listarAlmacen();
        }

        public int validarUsuario(Usuario usuario)
        {
            iniciaClase(TipoAcceso.WebService);
            return standarWS.validarUsuario(usuario);
        }

        //REGISTRAR

        public Bien[] buscarBienEtiqueta(Etiqueta etiqueta)
        {
            iniciaClase(TipoAcceso.WebService);
            return standarWS.buscarBienEtiqueta(etiqueta);
        }

        public bool registrarBienEtiqueta(Etiqueta etiqueta)
        {
            iniciaClase(TipoAcceso.WebService);
            return standarWS.registrarBienEtiqueta(etiqueta);
        }

        public bool modificarBienEtiqueta(Etiqueta etiqueta)
        {
            iniciaClase(TipoAcceso.WebService);
            return standarWS.modificarBienEtiqueta(etiqueta);
        }

        //SALIDA

        public Usuario[] listarUsuarioSolicitante()
        {
            iniciaClase(TipoAcceso.WebService);
            return standarWS.listarUsuarioSolicitante();
        }

        public Solicitud[] listarSolicitudUsuarioSalida(Usuario usuario)
        {
            iniciaClase(TipoAcceso.WebService);
            return standarWS.listarSolicitudUsuarioSalida(usuario);
        }

        public DetalleBienSolicitud[] obtenerSolicitudSalida(Solicitud solicitud)
        {
            iniciaClase(TipoAcceso.WebService);
            return standarWS.obtenerSolicitudSalida(solicitud);
        }

        public int registrarMovimiento(List<DetalleBienMovimiento> listaDetalleBienMovimiento, Movimiento movimiento)
        {
            iniciaClase(TipoAcceso.WebService);
            return standarWS.registrarMovimiento(listaDetalleBienMovimiento, movimiento);
        }

        public int actualizarMovimiento(List<DetalleBienMovimiento> listaDetalleBienMovimiento, Movimiento movimiento)
        {
            iniciaClase(TipoAcceso.WebService);
            return standarWS.actualizarMovimiento(listaDetalleBienMovimiento, movimiento);
        }

        public bool actualizarEstadoSolicitud(Solicitud solicitud)
        {
            iniciaClase(TipoAcceso.WebService);
            return standarWS.actualizarEstadoSolicitud(solicitud);
        }

        //INGRESO

       /* public Usuario[] listarUsuarioSolicitanteDevolucion()
        {
            iniciaClase(TipoAcceso.WebService);
            return standarWS.listarUsuarioSolicitanteDevolucion();
        }*/

        public Solicitud[] listarSolicitudUsuarioEntrada(Usuario usuario)
        {
            iniciaClase(TipoAcceso.WebService);
            return standarWS.listarSolicitudUsuarioEntrada(usuario);
        }


        public DetalleBienSolicitud[] obtenerSolicitudEntrada(Solicitud solicitud)
        {
            iniciaClase(TipoAcceso.WebService);
            return standarWS.obtenerSolicitudEntrada(solicitud);
        }

        //INCIDENCIA

        public IncidenciaTipo[] listarIncidenciaTipo()
        {
            iniciaClase(TipoAcceso.WebService);
            return standarWS.listarIncidenciaTipo();
        }
        public bool registrarIncidencia(Incidencia incidencia)
        {
            iniciaClase(TipoAcceso.WebService);
            return standarWS.registrarIncidencia(incidencia);
        }

        public bool actualizarBien(Bien bien)
        {
            iniciaClase(TipoAcceso.WebService);
            return standarWS.actualizarBien(bien);
        }

        public Movimiento[] listarMovimiento(Solicitud solicitud)
        {
            iniciaClase(TipoAcceso.WebService);
            return standarWS.listarMovimiento(solicitud);
        }

        #endregion
    }
}